#pragma once

//Goto Defined Functions to add a new data type

#include <Windows.h>
#include "Defines.h"

class VectorData
{
private:
	void * Data;
	int Data_Type;
public:
	VectorData():Data(NULL),Data_Type(NULL){}
	VectorData(VectorData * V) {
		//Data = new void *(V->Data);
		//Data_Type = V->Data_Type;
	}
	VectorData(int DataType,void * Data):Data(Data),Data_Type(DataType){}
	~VectorData();
	void SetDatawType(void * D,int Type);
	void SetDataType(int Type);
	int GetDataType(){return Data_Type;}
	void * & GetData() {
		return Data;
	}
};

class Vector
{
private:
	VectorData ** m_ptr;
	int m_size;
	int m_allocated;
public:
	Vector(){Init();}
	~Vector(){Clear();}
	int GetSize(){return m_size;}
	void Ensure_Capacity(int a_size);
	void Init();
	void Clear();
	VectorData * Get(int const & a_index) const;
	void Set(int a_index,int a_DataType,void * a_value);
	const int Index_Of(void * a_value);
	void Add(int a_DataType,void * a_value);
	void Add(VectorData * V);
	void Add(VectorData V);
	void Remove_by_Index(int a_index);
	void Remove_by_Value(void * a_value);
	void Remove_by_Value(VectorData a_V);
	void Remove_by_Value(VectorData * a_V);
	bool Has(void * a_value);
	void Sort();
	bool Empty();
	void Insert(int a_index,void * a_value,int a_DataType);
	void Add_Vector(Vector * V);
};